package org.apache.ibatis.common.reflection.factory;

import java.util.List;
import java.util.Properties;

/**
 * @Name ObjectFactory
 * @Description: 对象生产工厂接口
 * 描述信息：该接口主要基于反射技术生产出各种类型的对象。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-04-25 14:14:03
 **/
public interface ObjectFactory {

    /**
     * 设置工厂属性
     *
     * @param properties 属性配置
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 14:17:37
     */
    default void setProperties(Properties properties) {
        // NOP
    }

    /**
     * 采用无参构造方法生成这个类型的实例
     *
     * @param type 目标类型
     * @return T 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 14:19:17
     */
    <T> T create(Class<T> type);

    /**
     * 采用含参构造方法生成这个类型的实例
     *
     * @param type                目标类型
     * @param constructorArgTypes 构造参数类型列表
     * @param constructorArgs     构造参数值列表
     * @return T 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 14:20:14
     */
    <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);

    /**
     * 判断传入的类型是否为集合类型
     *
     * @param type 传入类型
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 14:21:43
     */
    <T> boolean isCollection(Class<T> type);

}
